gtkscrolledwindow: Do not eagerly claim touch press event
authorCarlos Garnacho <carlosg@gnome.org>
Fri, 25 Sep 2020 15:47:26 +0000 (17:47 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Fri, 25 Sep 2020 16:58:44 +0000 (18:58 +0200)
Claiming early makes the contents unable to react to the touch press
event. Do this on GtkGestureDrag::update past a threshold, so the
child widget(s) can claim before the scrolledwindow does.

Fixes: https://gitlab.gnome.org/GNOME/gtk/-/issues/3125
gtk/gtkscrolledwindow.c

index 7b38c3681241c519eaf1e7ccb2b2e5202fd34269..23196edb948df09df6dbaab724bbb5369123e2e1 100644 (file)
@@ -29,6 +29,7 @@
 #include "gtkadjustment.h"
 #include "gtkadjustmentprivate.h"
 #include "gtkbuildable.h"
+#include "gtkdragsource.h"
 #include "gtkeventcontrollermotion.h"
 #include "gtkeventcontrollerscroll.h"
 #include "gtkeventcontrollerprivate.h"
@@ -901,7 +902,6 @@ scrolled_window_drag_begin_cb (GtkScrolledWindow *scrolled_window,
                                GtkGesture        *gesture)
 {
   GtkScrolledWindowPrivate *priv = gtk_scrolled_window_get_instance_private (scrolled_window);
-  GtkEventSequenceState state;
   GdkEventSequence *sequence;
   GtkWidget *event_widget;
 
@@ -914,11 +914,7 @@ scrolled_window_drag_begin_cb (GtkScrolledWindow *scrolled_window,
 
   if (event_widget == priv->vscrollbar || event_widget == priv->hscrollbar ||
       (!may_hscroll (scrolled_window) && !may_vscroll (scrolled_window)))
-    state = GTK_EVENT_SEQUENCE_DENIED;
-  else
-    state = GTK_EVENT_SEQUENCE_CLAIMED;
-
-  gtk_gesture_set_sequence_state (gesture, sequence, state);
+    gtk_gesture_set_sequence_state (gesture, sequence, GTK_EVENT_SEQUENCE_DENIED);
 }
 
 static void
@@ -950,7 +946,12 @@ scrolled_window_drag_update_cb (GtkScrolledWindow *scrolled_window,
   GtkAdjustment *vadjustment;
   double dx, dy;
 
+  if (!gtk_drag_check_threshold (GTK_WIDGET (scrolled_window),
+                                 0, 0, offset_x, offset_y))
+    return;
+
   gtk_scrolled_window_invalidate_overshoot (scrolled_window);
+  gtk_gesture_set_state (gesture, GTK_EVENT_SEQUENCE_CLAIMED);
 
   hadjustment = gtk_scrollbar_get_adjustment (GTK_SCROLLBAR (priv->hscrollbar));
   if (hadjustment && may_hscroll (scrolled_window))